package com.example.demo.algorithm.graph;

import com.example.demo.algorithm.linear.Queue;

/**
 * @Author: xiatian
 * @CreateTime: 2022/2/6 9:33 下午
 * @Description: 有向图
 */
public class Digraph {
    //顶点的数目
    private int V;
    //边的数目
    private int E;
    //领接表
    private Queue<Integer>[] adj;

    public Digraph(int V) {
        //初始化顶点数量
        this.V = V;
        //初始化边的数量
        this.E = 0;
        //初始化领接表
        this.adj = new Queue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new Queue<Integer>();
        }
    }

    public int V() {
        return V;
    }

    public int E() {
        return E;
    }

    //向有向图中添加一条边v-w
    public void addEdge(int v, int w) {
        //只需要让顶点w出现在v的领接表中，最终v的领接表中存储的相邻顶点的含义是:v->其他顶点
        adj[v].enqueue(w);
        E++;
    }

    //获取由v指出的边所连接的所有顶点
    public Queue<Integer> adj(int v) {

        return adj[v];
    }

    //该图的反向图
    private Digraph reverse() {
        //创建有向图对象
        Digraph r = new Digraph(V);
        for (int i = 0; i < V; i++) {
            //获取由该顶点i指出的所有边
            for (Integer w : adj[i]) {//原图中表示的是有顶点i->w的边
                r.addEdge(w, i);
            }
        }
        return r;
    }


}
